/*
 * libpq_uri_regress.c
 *		用于 libpq URI 格式的测试程序
 *
 * 这是 libpq conninfo 回归测试的助手。它将单个 conninfo 字符串作为参数，使用 PQconninfoParse 解析，然后
 * 输出从解析的 PQconninfoOption 结构中不同于默认值的值（从 PQconndefaults 获取）。
 *
 * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *		src/interfaces/libpq/test/libpq_uri_regress.c
 */

#include "postgres_fe.h"

#include "libpq-fe.h"

int main(int fc_argc, char *fc_argv[])
{
	PQconninfoOption *fc_opts;
	PQconninfoOption *fc_defs;
	PQconninfoOption *fc_opt;
	PQconninfoOption *fc_def;
	char	   *fc_errmsg = NULL;
	bool		fc_local = true;

	if (fc_argc != 2)
		return 1;

	fc_opts = PQconninfoParse(fc_argv[1], &fc_errmsg);
	if (fc_opts == NULL)
	{
		fprintf(stderr, "libpq_uri_regress: %s", fc_errmsg);
		return 1;
	}

	fc_defs = PQconndefaults();
	if (fc_defs == NULL)
	{
		fprintf(stderr, "libpq_uri_regress: cannot fetch default options\n");
		return 1;
	}

	/*
	 * 遍历选项，如果不是默认值则打印每个值。
	 *
	 * XXX 该编码假设 PQconninfoOption 结构中的关键字总是按相同的顺序排列。
	 */
	for (fc_opt = fc_opts, fc_def = fc_defs; fc_opt->keyword; ++fc_opt, ++fc_def)
	{
		if (fc_opt->val != NULL)
		{
			if (fc_def->val == NULL || strcmp(fc_opt->val, fc_def->val) != 0)
				printf("%s='%s' ", fc_opt->keyword, fc_opt->val);

			/*
			 * 尝试检测这是否是 Unix 域套接字或 inet。 这有点麻烦，但这正是 libpq 本身所做的。
			 *
			 * 注意，我们直接测试 '/' 而不是使用 is_absolute_path，因为那样会复杂得多。
			 * 这在 Windows 上会失败，但该平台反正没有 Unix 域套接字。
			 */
			if (*fc_opt->val &&
				(strcmp(fc_opt->keyword, "hostaddr") == 0 ||
				 (strcmp(fc_opt->keyword, "host") == 0 && *fc_opt->val != '/')))
			{
				fc_local = false;
			}
		}
	}

	if (fc_local)
		printf("(local)\n");
	else
		printf("(inet)\n");

	return 0;
}
